#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <set>
#include <cstdlib>
#include <cstring>

using namespace std;

int findGCD(int x, int y) {
	if (x == 0) return y;
	else return findGCD(y%x, x);
}

class TPoint {
public:
	int x, y;
	int idx;

	TPoint& operator=(const TPoint& c) {
		x = c.x;
		y = c.y;
		idx = c.idx;
		return *this;
	}

	TPoint normalize(void) {
		int g = findGCD(x, y);
		x /= g;
		y /= g;
		return *this;
	}
};

TPoint operator-(TPoint& a, TPoint& b) {
	TPoint res;
	res.x = a.x - b.x;
	res.y = a.y - b.y;
	return res;
}

istream& operator >> (istream& in, TPoint& p) {
	return in >> p.x >> p.y;
}
ostream& operator << (ostream& out, TPoint& p) {
	return out << '(' << setw(4) << p.x << ',' << setw(4) << p.y << ')';
}

vector<TPoint> points;
TPoint dirs[310][310];

typedef struct TDIRINFO {
	TPoint dir;
	int a, b;
} TDIRINFO;

bool operator < (const TPoint& a, const TPoint& b) {
	if (a.x < b.x) return true;
	if (a.x > b.x) return false;
	return a.y < b.y;
}
bool operator < (const TDIRINFO& a, const TDIRINFO& b) {
	return a.dir < b.dir;
}
bool operator == (const TPoint& a, const TPoint& b) {
	return !(a<b || b<a);
}
bool operator == (const TDIRINFO& a, const TDIRINFO& b) {
	return a.dir == b.dir;
}

vector<TDIRINFO> dirInfos;


typedef struct TLINE {
	vector<TPoint> line;
} TLINE;

bool operator < (const TLINE& a, const TLINE& b) {
	for (unsigned int i=0; i<a.line.size(); ++i) {
		if (a.line[i] < b.line[i]) return true;
		if (b.line[i] < a.line[i]) return false;
	}
	return true;
}


void findDirs(void) {
	dirInfos.clear();
	for (unsigned int i=0; i<points.size(); ++i) {
		for (unsigned int j=i+1; j<points.size(); ++j) {
			dirs[i][j] = dirs[j][i] = (points[i]-points[j]).normalize();
			TDIRINFO info;
			info.a = i;
			info.b = j;
			info.dir = dirs[i][j];
			dirInfos.push_back(info);
		}
	}
	sort(dirInfos.begin(), dirInfos.end());
}

bool removeCheck(const TPoint& p) {
	return (p.x == -1);
}
int main(void)
{
	while (true) {
		TPoint p;
		points.clear();
		while (true) {
			cin >> p;
			if (p.x == 0 && p.y == 0) break;
			
			points.push_back(p);
		}
		if (points.size() == 0) break;
		for (unsigned int i=0; i<points.size(); ++i)
			points[i].idx = i;
		findDirs();


		vector<TLINE> lines;

		vector<TDIRINFO>::iterator it;
		it = adjacent_find(dirInfos.begin(), dirInfos.end());

		if (it != dirInfos.end()) {
			TDIRINFO last;
			vector<TPoint> line;
			vector<TDIRINFO>::iterator iterBegin;

			while (it != dirInfos.end()) {
				iterBegin = it;
				line.clear();
				last = *it;
				line.push_back(points[last.a]);
				line.push_back(points[last.b]);
				for (++it; it!=dirInfos.end(); ++it) {
					if (*it == last) {
						last = *it;
						line.push_back(points[last.a]);
						line.push_back(points[last.b]);
					}
					else break;
				}

// 				cout << "the line before remove: " << endl;
// 				for (int i=0; i<line.size(); ++i)
// 					cout << line[i];
// 				cout << endl;

				sort(line.begin(), line.end());
				vector<TPoint>::iterator it2;
				TPoint removable;
				removable.x = removable.y = -1;

				for (unsigned int i=1; i<line.size(); ++i) {
					if (!(line[i] == line[i-1])) {
						if (i==1) line[0] = removable;
						if (i == line.size()-1) line[i] = removable;
						else if (!(line[i] == line[i+1])) line[i] = removable;
					}
				}
				line.resize(remove_if(line.begin(), line.end(), removeCheck)-line.begin());
				line.resize(unique(line.begin(),line.end())-line.begin());

// 				cout << "the line: " << endl;
// 				for (int i=0; i<line.size(); ++i)
// 					cout << line[i];
// 				cout << endl;


				if (line.size() > 0) {
					bool mark[310];
					memset(mark, 0, 310);
					TLINE sline;


					for (unsigned int i=0; i<line.size(); ++i) {
						if (mark[i]) continue;
						mark[i] = true;
						sline.line.push_back(line[i]);
						for (unsigned int j=i+1; j<line.size(); ++j) {
							if (mark[j]) continue;
							for (vector<TDIRINFO>::iterator it2=iterBegin; it2!=it; ++it2) {
								int a = (*it2).a;
								int b = (*it2).b;
								if (a==line[i].idx && b==line[j].idx) {
									mark[j] = true;
									sline.line.push_back(line[j]);
									break;
								}
								if (b==line[i].idx && a==line[j].idx) {
									mark[j] = true;
									sline.line.push_back(line[j]);
									break;
								}
							}
						}
						lines.push_back(sline);
// 						cout << "the sline: " << endl;
// 						for (int i=0; i<sline.line.size(); ++i)
// 							cout << sline.line[i];
// 						cout << endl;
						sline.line.clear();
					}
				}

				it = adjacent_find(it, dirInfos.end());
				
			}
		}

		if (lines.size()>0) {
			cout << "The following lines were found:" << endl;
			sort(lines.begin(), lines.end());
			for (unsigned int i=0; i<lines.size(); ++i) {
				for (unsigned int j=0; j<lines[i].line.size(); ++j)
					cout << lines[i].line[j];
				cout << endl;
			}
			
		}else
			cout << "No lines were found" << endl;

	}
	return 0;
}